package ru.mirent;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ClickToSeeDifferenceExampleTest {

    /**
     * Метод демонстрирует возможность открытия окна 'Click to see difference' меджу ожидаемым и фактическим значением.
     * Содержимое взято из класса {@link org.junit.jupiter.api.AssertionFailureBuilder} метод 'formatValues(Object, Object)'.
     * Для того чтобы в выводе консоли была ссылка <Click to see difference>, необходимо сообщение исключения
     * сформиировать по паттерну: 'Text:expected: <expectedString> but was: <actualString>'.
     * Подробнее: <a href="https://github.com/JetBrains/intellij-community/blob/3f7e93e20b7e79ba389adf593b3b59e46a3e01d1/plugins/testng/src/com/theoryinpractice/testng/model/TestProxy.java#L50">список</a>
     * паттернов в исходном коде IDEA.
     * Данный паттерн срабатывает только при возникновени ошибки.
     */
    @Test
    void clickToSeeDifferenceExampleTest() {
        String message = "Возникла ошибка";
        String expected = "Текст для сравнения 1";
        String actual = "Текст для сравнения 2";

        String errorMessage = String.format("%s:expected: <%s> but was: <%s>", message, expected, actual);
        throw new RuntimeException(errorMessage);

//        Нижеследующие проверка и проброс исключения вызовет аналогичную реакцию
//        Assertions.assertEquals(expected, actual, message);
//        throw new AssertionFailedError(message, expected, actual);
    }

    //<editor-fold defaultstate="collpsed" desc="Примеры регулярных выражений, которые форматируются в консоли IDE IntelliJ IDEA">
    @Test
    void comparisionPatternTest() {
        Pattern comparisionPattern =
                Pattern.compile("(.*)expected same with:\\<(.*)\\> but was:\\<(.*)\\>.*", Pattern.DOTALL);

        String text = "Текст для демонстрации: expected same with:<Текст 1> but was:<Текст 2>";
        Matcher matcher = comparisionPattern.matcher(text);

        Assertions.assertTrue(matcher.find());
    }

    @Test
    void expectedButWasPatternTest() {
        Pattern expectedButWasPattern =
                Pattern.compile("(.*)expected:\\<(.*)\\> but was:\\<(.*)\\>.*", Pattern.DOTALL);

        String text = "Текст для демонстрации: expected:<Текст 1> but was:<Текст 2>";
        Matcher matcher = expectedButWasPattern.matcher(text);

        Assertions.assertTrue(matcher.find());
    }

    @Test
    void expectedButWasSetPatternTest() {
        Pattern expectedButWasSetPattern =
                Pattern.compile("(.*)expected \\[(.*)\\] but got \\[(.*)\\].*", Pattern.DOTALL);

        String text = "Текст для демонстрации: expected [Текст 1] but got [Текст 2]";
        Matcher matcher = expectedButWasSetPattern.matcher(text);

        Assertions.assertTrue(matcher.find());
    }

    @Test
    void expectedNotSameButWasPatternTest() {
        Pattern expectedNotSameButWasPattern =
                Pattern.compile("(.*)expected not same with:\\<(.*)\\> but was same:\\<(.*)\\>.*", Pattern.DOTALL);

        String text = "Текст для демонстрации: expected not same with:<Текст 1> but was same:<Текст 2>";
        Matcher matcher = expectedNotSameButWasPattern.matcher(text);

        Assertions.assertTrue(matcher.find());
    }

    @Test
    void expectedButFoundPatternTest() {
        Pattern expectedButFoundPattern =
                Pattern.compile("(.*)expected \\[(.*)\\] but found \\[(.*)\\].*", Pattern.DOTALL);

        String text = "Текст для демонстрации: expected [Текст 1] but found [Текст 2]";
        Matcher matcher = expectedButFoundPattern.matcher(text);

        Assertions.assertTrue(matcher.find());
    }

    @Disabled("TODO Необходимо подобрать текст для регулярного выражения")
    @Test
    void expectedButWasHamcrestPatternTest() {
        Pattern expectedButWasHamcrestPattern =
                Pattern.compile("(.*)\nExpected: .*?\"(.*)\"\n\\s*but: .*?\"(.*)\".*", Pattern.DOTALL);

        String text = "Текст для демонстрации:\nExpected: \"Текст 1\" but \"Текст 2\"";
        Matcher matcher = expectedButWasHamcrestPattern.matcher(text);

        Assertions.assertTrue(matcher.find());
    }
    //</editor-fold>
}
